package com.huaxin.device.dto.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;

/**
 * 告警类型
 */
public enum AlarmType implements BaseCodeEnum<String> {
    // -------------------- 断路器/电力相关 --------------------
    /**
     * 过流报警 (Over Current)
     * 电流超过设定阈值
     */
    OVER_CURRENT("over_current", "过流报警"),

    /**
     * 欠压报警 (Under Voltage)
     * 电压低于设定阈值
     */
    UNDER_VOLTAGE("under_voltage", "欠压报警"),

    /**
     * 过压报警 (Over Voltage)
     * 电压高于设定阈值
     */
    OVER_VOLTAGE("over_voltage", "过压报警"),

    /**
     * 漏电报警 (Leakage Current / Earth Fault)
     * 漏电流超过安全值
     */
    LEAKAGE_CURRENT("leakage_current", "漏电报警"),

    /**
     * 功率超限报警 (Over Power)
     * 有功功率超过设定阈值
     */
    OVER_POWER("over_power", "功率超限报警"),

    /**
     * 电能超限报警 (Over Energy)
     * 累计用电量超过设定阈值
     */
    OVER_ENERGY("over_energy", "电能超限报警"),

    /**
     * 断路器跳闸 (Circuit Breaker Trip)
     * 断路器因故障或手动操作断开
     */
    CIRCUIT_BREAKER_TRIP("circuit_breaker_trip", "断路器跳闸"),

    /**
     * 三相不平衡 (Three-Phase Imbalance)
     * 三相电流或电压不平衡度超过阈值
     */
    THREE_PHASE_IMBALANCE("three_phase_imbalance", "三相不平衡"),

    /**
     * 功率因数过低 (Low Power Factor)
     * 功率因数低于设定阈值
     */
    LOW_POWER_FACTOR("low_power_factor", "功率因数过低"),

    // -------------------- 环境检测仪相关 --------------------
    /**
     * 温度过高 (High Temperature)
     * 环境温度超过上限
     */
    HIGH_TEMPERATURE("high_temperature", "温度过高"),

    /**
     * 温度过低 (Low Temperature)
     * 环境温度低于下限
     */
    LOW_TEMPERATURE("low_temperature", "温度过低"),

    /**
     * 湿度过高 (High Humidity)
     * 环境湿度超过上限
     */
    HIGH_HUMIDITY("high_humidity", "湿度过高"),

    /**
     * 湿度过低 (Low Humidity)
     * 环境湿度低于下限
     */
    LOW_HUMIDITY("low_humidity", "湿度过低"),

    /**
     * PM2.5 超标 (PM2.5 Exceeded)
     * 可吸入颗粒物浓度超标
     */
    PM25_EXCEEDED("pm25_exceeded", "PM2.5 超标"),

    /**
     * PM10 超标 (PM10 Exceeded)
     * 可吸入颗粒物浓度超标
     */
    PM10_EXCEEDED("pm10_exceeded", "PM10 超标"),

    /**
     * CO2 浓度过高 (High CO2 Concentration)
     * 二氧化碳浓度超过健康阈值
     */
    HIGH_CO2("high_co2", "CO2 浓度过高"),

    /**
     * CO 浓度过高 (High CO Concentration)
     * 一氧化碳浓度超标（有毒气体）
     */
    HIGH_CO("high_co", "CO 浓度过高"),

    /**
     * 空气质量差 (Poor Air Quality)
     * 综合空气质量指数(AQI)达到差或严重污染级别
     */
    POOR_AIR_QUALITY("poor_air_quality", "空气质量差"),

    /**
     * 噪音超标 (Noise Exceeded)
     * 环境噪音分贝超过设定阈值
     */
    NOISE_EXCEEDED("noise_exceeded", "噪音超标"),

    /**
     * 粉尘浓度高 (High Dust Concentration)
     * 工业环境中的粉尘浓度超标
     */
    HIGH_DUST("high_dust", "粉尘浓度高"),

    // -------------------- 通用/设备状态 --------------------
    /**
     * 设备离线 (Device Offline)
     * 设备失去网络连接，无法通信
     */
    DEVICE_OFFLINE("device_offline", "设备离线"),

    /**
     * 设备上线 (Device Online)
     * 设备重新连接网络（可作为信息类报警）
     */
    DEVICE_ONLINE("device_online", "设备上线"),

    /**
     * 电池电量低 (Low Battery)
     * 设备内置电池电量不足
     */
    LOW_BATTERY("low_battery", "电池电量低"),

    /**
     * 传感器故障 (Sensor Fault)
     * 某个传感器读数异常或无响应
     */
    SENSOR_FAULT("sensor_fault", "传感器故障"),

    /**
     * 通信故障 (Communication Fault)
     * 设备与网关或服务器通信异常
     */
    COMMUNICATION_FAULT("communication_fault", "通信故障"),

    /**
     * 配置错误 (Configuration Error)
     * 设备配置参数错误或不一致
     */
    CONFIG_ERROR("config_error", "配置错误"),

    // -------------------- 安防相关 --------------------
    /**
     * 烟雾报警 (Smoke Alarm)
     * 烟雾探测器检测到烟雾
     */
    SMOKE_ALARM("smoke_alarm", "烟雾报警"),

    /**
     * 火警 (Fire Alarm)
     * 确认发生火灾（可能由多个传感器触发）
     */
    FIRE_ALARM("fire_alarm", "火警"),

    /**
     * 门磁报警 (Door Contact Alarm)
     * 门窗被非法打开
     */
    DOOR_CONTACT("door_contact", "门磁报警"),

    /**
     * 红外入侵报警 (Infrared Intrusion)
     * 红外探测器检测到移动物体
     */
    INFRARED_INTRUSION("infrared_intrusion", "红外入侵"),

    /**
     * 水浸报警 (Water Leak)
     * 水浸传感器检测到漏水
     */
    WATER_LEAK("water_leak", "水浸报警");

    @EnumValue
    private final String code;
    private final String displayName;

    AlarmType(String code, String displayName) {
        this.code = code;
        this.displayName = displayName;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    public static AlarmType of(String code) {
        for (AlarmType type : values()) {
            if (type.getCode().equalsIgnoreCase(code)) {
                return type;
            }
        }
        return null;
    }

    public static boolean isValid(String code) {
        return of(code) != null;
    }
}